﻿#include "circulardialsummary.h"

#include <QDebug>
#include <QHBoxLayout>
#include <QSequentialAnimationGroup>
#include <QSerialPort>
#include <qparallelanimationgroup.h>

#if _MSC_VER >= 1600
#pragma execution_character_set("utf-8")
#endif

CCirculardialSummary::CCirculardialSummary(QWidget* parent) : CAbstractCard(parent)
{
    setTitle("状态汇总");
    // 初始化串口
    auto serial = new QSerialPort(this);
    serial->setPortName("COM7");                        // 设置串口名称
    serial->setBaudRate(115200);                        // 设置波特率
    serial->setDataBits(QSerialPort::Data8);            // 设置数据位
    serial->setStopBits(QSerialPort::OneStop);          // 设置停止位
    serial->setParity(QSerialPort::NoParity);           // 设置无奇偶校验
    serial->setFlowControl(QSerialPort::NoFlowControl); // 设置无流控制

    // 检查串口是否已打开
    if (serial->isOpen())
    {
        qDebug() << "Serial port COM7 is already open"; // 串口已打开
    }
    else
    {
        // 尝试打开串口
        if (!serial->open(QIODevice::ReadWrite))
        {
            qDebug() << "Failed to open serial port COM7:" << serial->errorString(); // 输出错误信息
        }
        else
        {
            qDebug() << "Serial port COM7 opened successfully";                                    // 串口打开成功
            connect(serial, &QSerialPort::readyRead, this, &CCirculardialSummary::readSerialData); // 连接串口数据读取信号
        }
    }


    QHBoxLayout* layoutMain = new QHBoxLayout(getMainWnd());
    layoutMain->setMargin(6);
    layoutMain->setSpacing(10);

    {
        QLabel* label1 = new QLabel("温度", this);
        label1->setAlignment(Qt::AlignCenter);
        label1->setFixedHeight(16);

        label1->setStyleSheet("QLabel{color:rgba(255, 255, 255, 100); font-size:12px;}");

        CircularDial* dial = new CircularDial(this);
        dial->setNLow(60);
        dial->setNHigh(120);
        dial->setNMax(180);
        dial->setStrFormat("℃");

        QVBoxLayout* layoutRow = new QVBoxLayout();
        layoutRow->addWidget(dial, 1);
        layoutRow->addWidget(label1);
        layoutRow->setContentsMargins(0, 0, 0, 0);
        layoutRow->setSpacing(0);

        layoutMain->addLayout(layoutRow);
        // 如果串口不可用，设置初始值为0
        if (!serial->isOpen())
        {
            dial->setFDialValue(0); // 设置初始值为0
        }
        else
        {
            m_dials["temp"] = dial; // 保存温度仪表盘指针
        }
        connect(this, &CCirculardialSummary::valueChanged, [this](int value)
        {
            // 确保值有效
            //qDebug() << "temp 的 动画 , 结束值为 " << value;
            QPropertyAnimation* animation = new QPropertyAnimation(m_dials["temp"], "DialValue"); // 创建动画
            animation->setDuration(200);                                                          // 设置动画持续时间
            animation->setStartValue(m_dials["temp"]->fDialValue());                              // 设置起始值为当前值
            animation->setEndValue(value);                                                        // 设置结束值为目标值
            animation->setEasingCurve(QEasingCurve::OutQuad);                                     // 设置缓动曲线
            animation->start(QAbstractAnimation::DeleteWhenStopped);                              // 启动动画并在完成后删除
        });
    }

    {
        QLabel* label1 = new QLabel("湿度", this);
        label1->setAlignment(Qt::AlignCenter);
        label1->setFixedHeight(16);

        label1->setStyleSheet("QLabel{color:rgba(255, 255, 255, 100); font-size:12px;}");

        CircularDial* dial = new CircularDial(this);
        dial->setNLow(40);
        dial->setNHigh(80);
        dial->setNMax(100);
        dial->setStrFormat("%");

        QVBoxLayout* layoutRow = new QVBoxLayout();
        layoutRow->addWidget(dial, 1);
        layoutRow->addWidget(label1);
        layoutRow->setContentsMargins(0, 0, 0, 0);
        layoutRow->setSpacing(0);

        layoutMain->addLayout(layoutRow);
        // 如果串口不可用，设置初始值为0
        if (!serial->isOpen())
        {
            dial->setFDialValue(0); // 设置初始值为0
        }
        else
        {
            m_dials["humidity"] = dial; // 保存湿度仪表盘指针
        }
        connect(this, &CCirculardialSummary::valueChanged, [this](int value)
        {
            // 确保值有效
            //qDebug() << "humidity 的 动画 , 结束值为 " << value;
            QPropertyAnimation* animation = new QPropertyAnimation(m_dials["humidity"], "DialValue"); // 创建动画
            animation->setDuration(200);                                                              // 设置动画持续时间
            animation->setStartValue(m_dials["humidity"]->fDialValue());                              // 设置起始值为当前值
            animation->setEndValue(value);                                                            // 设置结束值为目标值
            animation->setEasingCurve(QEasingCurve::OutQuad);                                         // 设置缓动曲线
            animation->start(QAbstractAnimation::DeleteWhenStopped);                                  // 启动动画并在完成后删除
        });
    }

    {
        QLabel* label1 = new QLabel("CPU", this);
        label1->setAlignment(Qt::AlignCenter);
        label1->setFixedHeight(16);

        label1->setStyleSheet("QLabel{color:rgba(255, 255, 255, 100); font-size:12px;}");

        CircularDial* dial = new CircularDial(this);
        dial->setNLow(20);
        dial->setNHigh(60);
        dial->setNMax(100);
        dial->setStrFormat("%");

        QVBoxLayout* layoutRow = new QVBoxLayout();
        layoutRow->addWidget(dial, 1);
        layoutRow->addWidget(label1);
        layoutRow->setContentsMargins(0, 0, 0, 0);
        layoutRow->setSpacing(0);

        layoutMain->addLayout(layoutRow);

        // 如果串口不可用，设置初始值为0
        if (!serial->isOpen())
        {
            dial->setFDialValue(0); // 设置初始值为0
        }
        else
        {
            m_dials["cpu"] = dial; // 保存CPU仪表盘指针
        }
        connect(this, &CCirculardialSummary::valueChanged, [this](int value)
        {
            // 确保值有效
            //qDebug() << "cpu 的 动画 , 结束值为 " << value;
            QPropertyAnimation* animation = new QPropertyAnimation(m_dials["cpu"], "DialValue"); // 创建动画
            animation->setDuration(200);                                                         // 设置动画持续时间
            animation->setStartValue(m_dials["cpu"]->fDialValue());                              // 设置起始值为当前值
            animation->setEndValue(value);                                                       // 设置结束值为目标值
            animation->setEasingCurve(QEasingCurve::OutQuad);                                    // 设置缓动曲线
            animation->start(QAbstractAnimation::DeleteWhenStopped);                             // 启动动画并在完成后删除
        });
    }

    {
        QLabel* label1 = new QLabel("内存", this);
        label1->setAlignment(Qt::AlignCenter);
        label1->setFixedHeight(16);

        label1->setStyleSheet("QLabel{color:rgba(255, 255, 255, 100); font-size:12px;}");

        CircularDial* dial = new CircularDial(this);
        dial->setNLow(60);
        dial->setNHigh(90);
        dial->setNMax(100);
        dial->setStrFormat("%");

        QVBoxLayout* layoutRow = new QVBoxLayout();
        layoutRow->addWidget(dial, 1);
        layoutRow->addWidget(label1);
        layoutRow->setContentsMargins(0, 0, 0, 0);
        layoutRow->setSpacing(0);

        layoutMain->addLayout(layoutRow);

        // 如果串口不可用，设置初始值为0
        if (!serial->isOpen())
        {
            dial->setFDialValue(0); // 设置初始值为0
        }
        else
        {
            m_dials["mem"] = dial; // 保存内存仪表盘指针
        }

        connect(this, &CCirculardialSummary::valueChanged, [this](int value)
        {
            // 确保值有效
            //qDebug() << "创建mem 的 动画 , 结束值为 " << value;
            QPropertyAnimation* animation = new QPropertyAnimation(m_dials["mem"], "DialValue"); // 创建动画
            animation->setDuration(200);                                                         // 设置动画持续时间
            animation->setStartValue(m_dials["mem"]->fDialValue());                              // 设置起始值为当前值
            animation->setEndValue(value);                                                       // 设置结束值为目标值
            animation->setEasingCurve(QEasingCurve::OutQuad);                                    // 设置缓动曲线
            animation->start(QAbstractAnimation::DeleteWhenStopped);                             // 启动动画并在完成后删除
        });
    }
}

/**
 * @brief 读取并处理串口数据
 */
void CCirculardialSummary::readSerialData()
{
    QSerialPort* serial = qobject_cast<QSerialPort*>(sender()); // 获取发送信号的串口对象
    QByteArray data = serial->readAll();                        // 读取所有串口数据
    QString dataStr = QString::fromUtf8(data).trimmed();        // 转换为字符串并去除空白
    auto value = dataStr.toFloat();
    // 更新仪表盘的值
    emit valueChanged(value);
}
